/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */


#include "AcsError.h"
#include "AcsRequest.h"
#include "AcsResponse.h"
#include "IAcsClient.h"
#include "DefaultAcsClient.h"
#include "RoaAcsRequest.h"
#include "RpcAcsRequest.h"
#include "auth/ISigner.h"
#include "auth/HmacSha1.h"
#include "auth/ICredentialProvider.h"
#include "auth/ISignatureComposer.h"
#include "auth/RpcSignatureComposer.h"
#include "auth/RoaSignatureComposer.h"
#include "auth/OssSignatureComposer.h"
#include "profile/IClientProfile.h"
#include "profile/DefaultProfile.h"

using aliyun::AcsError;
using aliyun::AcsRequest;
using aliyun::AcsResponse;
using aliyun::IAcsClient;
using aliyun::RoaAcsRequest;
using aliyun::RpcAcsRequest;
using aliyun::DefaultAcsClient;
using aliyun::auth::ISigner;
using aliyun::auth::HmacSha1;
using aliyun::auth::RpcSignatureComposer;
using aliyun::auth::RoaSignatureComposer;
using aliyun::auth::OssSignatureComposer;
using aliyun::profile::DefaultProfile;
using aliyun::profile::IClientProfile;

class FooResponse : public AcsResponse {
 public:
  // all subclass need override this static method:
  static FooResponse unmarshall(UnmarshallerContext context) {
    FooResponse response;
    return response;
  }

  // all subclass need override this static method:
  IMPLEMENT_CLASSNAME(FooResponse)
};

class FooRequest : public RpcAcsRequest<FooResponse> {
 public:
  typedef RpcAcsRequest<FooResponse> supper;

  FooRequest(string product)
      : supper(product) {
  }
};

void testAcsTypes() {
  DefaultAcsClient client;
  FooRequest request("foo");
  FooResponse response = client.getAcsResponse(request);
}

int main() {
  testAcsTypes();
  return 0;
}

